package com.atguigu.utils;


import com.atguigu.heap.HeapSort;
import com.atguigu.sort.*;
import com.sun.scenario.effect.Merge;

import java.lang.reflect.Method;
import java.util.Arrays;

public class SortingHelper {

    private SortingHelper() {
    }

    public static <E extends Comparable<E>> boolean isSorted(E[] arr) {
        for (int i = 0; i < arr.length - 1; i++) {
            if (arr[i].compareTo(arr[i + 1]) > 0) {
                return false;
            }
        }
        return true;
    }

    public static <E extends Comparable<E>> void sortTest(String sortname, E[] arr) {

        long startTime = System.nanoTime();
        if ("SelectionSort".equals(sortname)) {
            SelectionSort.Sort(arr);
        } else if ("InsertionSort".equals(sortname)) {
            InsertSort.Sort(arr);
        } else if ("InsertionSort2".equals(sortname)) {
            InsertSort.Sort2(arr);
        } else if ("QuickSort".equals(sortname)) {
            QuickSort.Sort(arr);
        } else if ("MergeSort".equals(sortname)) {
            MergeSort.Sort(arr);
        } else if ("MergeSort2".equals(sortname)) {
            MergeSort.Sort2(arr);
        } else if ("MergeSort3".equals(sortname)) {
            MergeSort.Sort3(arr);
        } else if ("MergeSortBU".equals(sortname)) {
            MergeSort.Sort4(arr);
        } else if ("QuickSort3Ways".equals(sortname)) {
            QuickSort.Sort3Ways(arr);
        } else if ("HeapSort".equals(sortname)) {
            HeapSort.Sort(arr);
        } else if ("HeapSort2".equals(sortname)) {
            HeapSort.Sort2(arr);
        } else if ("BubbleSort".equals(sortname)) {
            BubbleSort.sort(arr);
        } else if ("BubbleSort2".equals(sortname)) {
            BubbleSort.sort2(arr);
        } else if ("BubbleSort3".equals(sortname)) {
            BubbleSort.sort3(arr);
        } else if ("ShellSort".equals(sortname)) {
            ShellSort.sort(arr);
        } else if ("ShellSort3".equals(sortname)) {
            ShellSort.sort(arr);
        } else if ("LSDSort".equals(sortname)) {
            String[] strArr = (String[]) arr;
            if (strArr.length == 0) {
                throw new IllegalArgumentException("arr can be empty");
            }
            LSDSort.sort(strArr, strArr[0].length());
        }
        long endTime = System.nanoTime();

        double time = (endTime - startTime) / 1000000000.0;
        //对排序后的数组进行验证
        if (!SortingHelper.isSorted(arr))
            throw new RuntimeException(sortname + " failed");
        System.out.println(String.format("%s , n = %d : %f s", sortname, arr.length, time));




       /* try{
            Class sortClass = Class.forName(sortname);
            Method sortMethod = sortClass.getMethod("Sort", Comparable[].class);
            Object[] params = new Object[]{arr};

            long startTime = System.nanoTime();
            sortMethod.invoke(null, params);
            long endTime = System.nanoTime();

            double time = (endTime - startTime) / 1000000000.0;
            //对排序后的数组进行验证
            if(!SortingHelper.isSorted(arr))
                throw new RuntimeException(sortname + " failed");
            System.out.println(String.format("%s , n = %d : %f s", sortname, arr.length, time));
        }catch (Exception e){
            System.out.println(e.getMessage());
            e.printStackTrace();
            System.out.println("Error in SortingHelper.sortTest!");
        }*/
    }
}
